/*
 * author: yeyi
 * date: 2017年10月7日
 */
package test;

class A{
    int a = 0;
    int cut(){
        System.out.println("cut: "+a);
        return --a;
    }
    int add(){
        System.out.println("add: "+a);
        return ++a;
    }
}

class B{
    String s;
    String add(String a){
        s += a;
        return s;
    }
}


/**
 * finally 中 return 的影响
 * http://blog.csdn.net/abinge317/article/details/52253768
 * @author: yeyi
 * @date: 2017年10月7日
 */
public class FinallyReturn {

    public static int test() {
        int i=0;
        try {
            i = 11;
            System.out.println("try 1: "+i);
            return i--; // 先执行完 -- 再到 finally 中执行(--i与i--效果一样)
        } finally {
            System.out.println("finally 1: "+i);
            i+=2; // 这个修改只在 finally 中有影响，没有影响返回值
            //return i;
        }
    }
    
    public static int test2() {
        int i=0;
        try {
            i = 11;
            System.out.println("try 2: "+i);
            return i--; // 先执行完 -- 再到 finally 中执行(--i与i--效果一样)
        } finally {
            System.out.println("finally 2: "+i);
            i+=2;
            return i; // 直接用这个返回值
        }
    }
//    
//    public static int test7() {
//        Integer i=new Integer(1111);
//        try {
//            i = 2222;
//            System.out.println("try 7: "+i);
//            return --i;
//        } finally {
//            System.out.println("finally 7: "+i);
//            i+=2; // 这个修改没起作用，就像这里的 i 与 try 中的 i 不是同一个变量。
//            //return i;
//        }
//    }
//    
//    public static int test8() {
//        Integer i=new Integer(1111);
//        try {
//            i = 2222;
//            System.out.println("try 8: "+i);
//            return --i; // 这个 -- 没有执行
//        } finally {
//            System.out.println("finally 8: "+i);
//            i+=2;
//            return i;
//        }
//    }
    
//    public static int test3() {
//        A a = new A();
//        try {
//            a.a = 1;
//            System.out.println("try 3: "+a.a);
//            return a.cut();
//        } finally {
//            ++a.a; // 这里的 a 并没有经过上面的 try 语句，像是在 try 之前另外创建的一个副本。并不影响 try 中的 a
//            System.out.println("finally 3: "+a.a);
//            //return i;
//        }
//    }
//    
//    public static int test4() {
//        A a = new A();
//        try {
//            a.a = 1;
//            System.out.println("try 4: "+a.a);
//            return a.cut();
//        } finally {
//            ++a.a;
//            System.out.println("finally 4: "+a.a);
//            return a.a;
//        }
//    }
//    
    public static String test5() {
        B b = new B();
        try {
            b.s = "1";
            System.out.println("try 5: "+b.s);
            return b.add("t");
        } finally {
            b.add("f");
            System.out.println("finally 5: "+b.s);
            //return b.s;
        }
    }
    
    public static String test6() {
        B b = new B();
        try {
            b.s = "1";
            System.out.println("try 6: "+b.s);
            return b.add("t");
        } finally {
            b.add("f"); 
            System.out.println("finally 6: "+b.s);
            return b.s;
        }
    }
    
    public static String test9() {
        String s = "";
        try {
            s = "11";
            System.out.println("try 9: "+s);
            return s+="1"; // 先执行完 -- 再到 finally 中执行(--i与i--效果一样)
        } finally {
            System.out.println("finally 9: "+s);
            s += "2"; // 这个修改只在 finally 中有影响，没有影响返回值
            //return i;
        }
    }
    
    public static String test10() {
        String s = "";
        try {
            s = "11";
            System.out.println("try 10: "+s);
            return s+="1"; // 先执行完 -- 再到 finally 中执行(--i与i--效果一样)
        } finally {
            System.out.println("finally 10: "+s);
            s += "2";
            return s; // 直接用这个返回值
        }
    }
    
    public static void main(String [] argv){
//        System.out.println(test());
//        System.out.println(test2());
//        System.out.println(test3());
//        System.out.println(test4());
//        System.out.println(test5());
//        System.out.println(test6());
//        System.out.println(test7());
//        System.out.println(test8());
        System.out.println(test9());
        System.out.println(test10());
    }
}
